package com.handy.webwork.action;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;

/**
 * 用户权限判断。
 * 该类实例会自动装载到Action中，在Action中通过getAuthority()来获取实例。
 * @author rocken.zeng@gmail.com
 *
 */
public class Authority {
	
	/**
	 * 判断用户是否在基本权限字段上有对应权限。
	 * @param authkind
	 * @return
	 */
	public boolean is(Integer authid, String authkind){
		if(isAdmin()) return true;
		if (null==authkind || "".equals(authkind)){//不指定authkind
			if (null!=auths.get(authid) && !auths.get(authid).isEmpty()){
				return true;
			}
		}else{
			if (null!=auths.get(authid) && auths.get(authid).contains(authkind)){
				return true;
			}
		}
		
		return false;
	}
	
	/**
	 * 判断用户是否在基本权限字段上有权限。
	 * @param authid
	 * @return
	 */
	public boolean is(Integer authid){
		return is(authid, null);
	}
	
	/**
	 * 判断用户是否在某个扩展权限上有对应权限。
	 * @param authid
	 * @param pcolvalue h_auth_dyna_role_infos.authkey_pcolvalue
	 * @param authkind
	 * @return
	 */
	public boolean dynaIs(Integer authid,String pcolvalue,String authkind){
		if(isAdmin()) return true;
		if (null == pcolvalue || "".equals(pcolvalue)){
			if (authDynas.containsKey(authid) && !authDynas.get(authid).isEmpty()){
				return true;
			}
		}else{
			if (null != authkind && !"".equals(authkind)){
				if (authDynas.containsKey(authid) && authDynas.get(authid).containsKey(pcolvalue) && authDynas.get(authid).get(pcolvalue).contains(authkind)){
					return true;
				}
			}else{
				if (authDynas.containsKey(authid) && authDynas.get(authid).containsKey(pcolvalue) && !authDynas.get(authid).get(pcolvalue).isEmpty()){
					return true;
				}
			}
		}
		
		return false;
	}
	
	/**
	 * 判断用户是否在扩展权限上有权限。
	 * @param authid
	 * @return
	 */
	public boolean dynaIs(Integer authid){
		return dynaIs(authid,null,null);
	}
	
	/**
	 * 判断用户是否在某个扩展权限上有权限。
	 * @param authid
	 * @param pcolvalue
	 * @return
	 */
	public boolean dynaIs(Integer authid,String pcolvalue){
		return dynaIs(authid,pcolvalue,null);
	}
	
	/**
	 * 获取用户在指定authid上的pcolvalues集合。
	 * @param authid
	 * @return
	 */
	public ArrayList<String> findPcolvalues(Integer authid){
		if (isAdmin()) return new ArrayList<String>();
		ArrayList<String> pcolList = new ArrayList<String>();
		HashMap<String,HashSet<String>> pcolMaps = authDynas.get(authid);
		Set<Entry<String, HashSet<String>>> pcols = pcolMaps.entrySet();
		for (Map.Entry<String, HashSet<String>> entry : pcols) {
			pcolList.add(entry.getKey());
		}
		return pcolList;
	}
	
	/**
	 * 基本权限：用户在所有基本authid上的权限类型。
	 * HashMap<authid,HashSet<authkind>>
	 */
	private HashMap<Integer,HashSet<String>> auths = new HashMap<Integer,HashSet<String>>();
	
	/**
	 * 扩展权限：用户在所有扩展authid,pcolvalue上的权限类型。 
	 * HashMap<authid,HashMap<pcolvalue,HashSet<authkind>>>
	 */
	private HashMap<Integer,HashMap<String,HashSet<String>>> authDynas = new HashMap<Integer,HashMap<String,HashSet<String>>>();
	
	public HashMap<Integer,HashSet<String>> getAuths() {
		return auths;
	}

	private boolean isAdmin = false;

	public boolean isAdmin() {
		return isAdmin;
	}

	public void setAdmin(boolean isAdmin) {
		this.isAdmin = isAdmin;
	}
	
	public void setAuths(HashMap<Integer, HashSet<String>> auths) {
		this.auths = auths;
	}

	public void setAuthDynas(
			HashMap<Integer, HashMap<String, HashSet<String>>> authDynas) {
		this.authDynas = authDynas;
	}

	public HashMap<Integer,HashMap<String,HashSet<String>>> getAuthDynas() {
		return authDynas;
	}

}
